package mylab.io.base.property;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.base.Joiner;

import java.time.LocalDateTime;

import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import mylab.io.base.fsm.DasStatus;

@Slf4j
@Getter
@Setter
public class CommonAttrs {

    /**
     * 标识是否客户端模式das
     * <p>
     * 一般情形下：客户端只有唯一连接通道到服务端，服务端有多条通道与相应客户端关联
     * 因此不同模式下，das daemon机制有差异：
     * 1、服务端daemon目标：das 保持 {@link DasStatus.Running} 状态
     * 2、客户端daemon目标：不仅保持Running状态，且保持与服务端的连接状态可用，即 isConnected = true
     */
    boolean clientMode = false;

    //所属协议
    ProtocolAttrs protocol = new ProtocolAttrs();

    //空闲检查参数
    IdleAttrs idle = new IdleAttrs();
    //同步配对参数
    SyncAttrs sync = new SyncAttrs();
    //定时计划之das心跳周期
    int heartbeatSeconds = 0;
    //定时计划之das守护周期
    int daemonSeconds = 0;

    //启动时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    LocalDateTime startTime = LocalDateTime.now();
    //最后一次心跳时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    LocalDateTime lastHeartbeatTime = LocalDateTime.now();

    //是否启用异步事件
    boolean eventEnabled = true;
    //是否启用 das 观察者回调
    boolean watcherEnabled = true;


    /**
     * 存活到期时间
     */
    @JsonIgnore
    public LocalDateTime getExpirationTime() {
        return lastHeartbeatTime.plusSeconds(heartbeatSeconds);
    }

    /**
     * 是否到期
     */
    @JsonIgnore
    public boolean isExpired() {
        return isHeartbeat() && getExpirationTime().isBefore(LocalDateTime.now());
    }

    /**
     * 是否开启守护机制
     */
    @JsonIgnore
    public boolean isDaemon() {
        return daemonSeconds > 0;
    }

    /**
     * 是否开启das心跳机制
     */
    @JsonIgnore
    public boolean isHeartbeat() {
        return heartbeatSeconds > 0;
    }

}
